<?php

/**
 * Store_CommentsController
 *
 * Модуль магазина, контроллер комментариев товара.
 *
 * @package   Store
 * @author    Игорь Будасов aka Lord <igor.budasov@gmail.com>
 * @copyright Игорь Будасов aka Lord <igor.budasov@gmail.com>
 */

class Store_CommentsController extends Lord_Controller_Action
{

/*------------------------------------------------------------------------------*/

	/**
	 * Показывает список всех коммнетариев к товару
	 * и формочку добавления комментария
	 */

	public function indexAction()
	{
		// передаем в вид формочку оставления камента
		$this->view->form = $this->_form();
		// и одобреные комментарии
		$this->view->comments = $this->model->getApprovedComments($this->_checkId());

		return;
	}

/*------------------------------------------------------------------------------*/

	/**
	 * Показывает список всех коммнетариев
	 */

	public function listAction()
	{
		// и одобреные комментарии
		$this->view->comments = $this->model->getAllApprovedComments();

		return;
	}

/*------------------------------------------------------------------------------*/

	/**
	* Одобрение комментариев к товару
	*/

	public function approveAction()
	{
		$id = $this->_getParam('id');

		// если у нас есть айдишник - аппрувим комментрий
		if($id != null)
		{
			$this->model->approveComment($id);
			return $this->_redirect('/store/comments/approve');
		}
		// если айдишника нет - показываем спик неодобреных каментов
		else
		{
			$this->view->comments = $this->model->getNotApprovedComments();
			return ;
		}
	}


/*------------------------------------------------------------------------------*/

	/**
	* Добавление валюты
	*/

	public function addAction()
	{
		return $this->_process('add');
	}

/*------------------------------------------------------------------------------*/

	/**
	* Удаление валюты
	*/

	function deleteAction()
	{
		// проверяем айдишник
		$id = $this->_checkId();

		// получаем комментарий
		$this->view->comment = $this->model->getComment($id);

		if ($this->_request->isPost())
		{
			// если юзер подтверждает - удаляем
			if ($this->_request->getPost('conf') == 'ok')
			{
				$this->model->delComment($id);
			}
		}
		else
		{
			// если в $this->view->comment пусто - нам пытаются скормить левый $id
			if(empty($this->view->comment))
				return $this->view->err = 'store_comments_delete_fail';
			else
				return;
		}
		// возвращаемся на главную страницу
		$this->_redirect('store/comments/approve');
	}

/*==============================================================================*/

	/**
	* Приватный метод для проверки айдишника записи
	*/

	private function _checkId()
	{
		$id = (!isset($this->view->good->id))
			? $this->_getParam('id')
			: $this->view->good->id;

		if( $id == false
			or $id == null
			or empty($id)
			or !isset($id))
		{
			return $this->_redirect('');
		}
		else
		{
			return (int)$id;
		}
	}

/*------------------------------------------------------------------------------*/

	/**
	* Приватный метод для обработки
	* добавления и редактирования
	*
	* @param string $action
	* @param array $data
	* @return void
	*/

	private function _process($action = 'add', $data = array())
	{
		// показываем форму
		$form = $this->_form($data, array(), $action);
		$this->view->assign('form', $form);

		// валидация
		if (!empty($_POST))
		{
			if (!$form->isValid($_POST))
			{
				// показываем сообщение об ошибке
				$this->view->err = 'form_fail';
				// получаем невалидные значения, введенные в форму
				$values = $form->getUnfilteredValues();
				// получаем ошибки
				$errors = $form->getErrors();
				// показываем форму с невалидными данными
				return $this->view->form = $this->_form($values, $errors, $action);
			}
		}

		/**
		* обрабатываем форму
		*/
		// если к нам что-то пришло из поста
		if ($this->_request->isPost())
		{
			// получаем корректные данные, введенные юзером
			$values = $form->getValues();

			// добавление комментария
			if($action == 'add')
			{
				$data['name']    = $values['name'];
				$data['comment'] = $values['comment'];
				$data['type']    = $values['type'];
				$data['gid']     = $values['id'];

				// добавляем в базу
				$this->model->addComment($data);

				// сообщение
				// $this->view->msg = $this->view->translate('store_comments_process_add_ok');
				return $this->_redirect('/store/goods/view/id/' . $values['id']);
			}
		}
	}

/*------------------------------------------------------------------------------*/

	/**
	* Приватный метод для построения формы
	* В качестве аргумента принимает уже заполненые
	* данные (при редактировании)
	*
	* @param $data array
	* @param $errors array
	* @param $action string
	* @param $id int
	* @return object
	*/

	private function _form($data   = array(),
						   $errors = array(),
						   $action = 'add')
	{
		$id = $this->_checkId();
		// обратите внимание, форма создается на основе собственного класса.
		$form = new Lord_Form_Form();
		$form->setAction(  '/' . $this->_moduleName
						 . '/' . $this->_controllerName
						 . '/' . $action
						 . '/id/' . $id);

		// кодировка
		$charset = $this->_helper->config()->common->charset;


		// Имя юзера, который добавляет камент
		$name = new Lord_Form_Element_Text('name', array(
			'required'    => true,
			'label'       => $this->view->translate('store_comments_form_name'),
			'description' => $this->view->translate('store_comments_form_name_desc'),
			'maxlength'   => '250',
			'validators'  => array(
				array('StringLength', true, array(0, 250, $charset))
			),
			'value'       => (!empty($data['name'])) ? $data['name'] : ''
		));
		$form->addElement($name);

		// Textarea элемент Комментарий
		$comment = new Zend_Form_Element_Textarea('comment', array(
			'label'       => $this->view->translate('store_comments_form_comment'),
			'description' => $this->view->translate('store_comments_form_comment_desc'),
			'required'    => true,
			'rows'        => '5',
			'cols'        => '47',
			'maxlength'   => '500',
			'validators'  => array(
				array('StringLength', true, array(0, 500, $charset))
			 ),
			'filters'     => array('StringTrim'),
			'value'       => (!empty($data['comment'])) ? $data['comment'] : ''
		));
		$form->addElement($comment);

		// Типа комментария: положительный, нейтральный, отрицательный
		$type = new Zend_Form_Element_Radio('type', array(
			'label'       => $this->view->translate('store_comments_form_type'),
			'description' => $this->view->translate('store_comments_form_type_desc'),
			'required'    => true,
			'multiOptions'=> array('0' => $this->view->translate('store_comments_form_type_positive'),
								   '1' => $this->view->translate('store_comments_form_type_neutral'),
								   '2'=>  $this->view->translate('store_comments_form_type_negative'),),
			'validators'  => array(array('InArray', true, array(array('1', '2', '0'), true))),
			'value'       => (!empty($data['type'])) ? $data['type'] : ''
		));
		// Задаем разделитель пробел, для того что бы
		// радио кнопки располагались в ряд
		$type->setSeparator(' ');
		$form->addElement($type);

		$id = $form->createElement('hidden', 'id')
			->setValue($this->_checkId());
		$form->addElement($id);


		// кнопка сабмита
		$form->addElement('submit',
						  'save',
						  array('label' => $this->view->translate('store_comments_form_submit')));

		// ошибки
		$this->_helper->FormErrors($errors, $form);

		// возвращаем форму
		return $form;
	}

}
